home *** CD-ROM | disk | FTP | other *** search
/ SGI Developer Toolbox 6.1 / SGI Developer Toolbox 6.1 - Disc 4.iso / public / bit / src / medianf.c < prev    next >
C/C++ Source or Header  |  1994-08-01  |  5KB  |  240 lines

  1. /*
  2.  * $Id: medianf.c,v 0.91 1994/02/20 00:53:30 zhao Pre-Release $
  3.  *
  4.  *. This file is part of BIT shareware package. After the two weeks of
  5.  *  free evaluation period, you are encouraged (required) to register
  6.  *  your copy for a small registration fee, which is $35 for personal use
  7.  *  and $50 for commercial, government and institutional use.
  8.  *
  9.  *  Copyright(c) 1993, 1994 by T.C. Zhao.
  10.  *  All rights reserved.
  11.  *
  12.  *  Permission to use, copy, and distribute this software in its entirety
  13.  *  for non-commercial purposes is hereby granted, provided that the
  14.  *  above shareware and copyright notices and this permission notice
  15.  *  appear in all copies and their documentation.
  16.  *
  17.  *  This software may be modified for your own use, but modified versions
  18.  *  may not be distributed without prior consent of the author.
  19.  *
  20.  *  This software is provided "as is" without expressed or implied
  21.  *  warranty of any kind.
  22.  *
  23.  *.
  24.  *
  25.  *  Purpose:
  26.  *    A. Perform a median filtering on the image or a part of it.
  27.  *    B. Sharpen an image or a part of it via convolution
  28.  *
  29.  */
  30.  
  31. #if !defined(lint) && defined(F_ID)
  32. char *id_mdf = "$Id: medianf.c,v 0.91 1994/02/20 00:53:30 zhao Pre-Release $";
  33. #endif
  34.  
  35. #include "bit.h"
  36. #include "extern.h"
  37.  
  38. /************** Local variables ********************/
  39.  
  40. static Rect_t medfreg, *mr;    /* current region       */
  41. static int rbcolor = 1;        /* rubber band color    */
  42.  
  43. /***************** Median Filtering *******************************{*/
  44.  
  45. /**************** Local functions *************************/
  46.  
  47. static int medianf_init(IPTR, int);
  48. static int medianf_keybd(int);
  49. static int medianf_popup(IPTR);
  50.  
  51. /****************************************************************
  52.  * Global entry point
  53.  ****************************************************************/
  54.  
  55. int
  56. do_medianf(IPTR im)
  57. {
  58.     short val;
  59.     long dev;
  60.     int done = 0;
  61.  
  62.     mr = &medfreg;
  63.     medianf_init(im, 0);
  64.     install_wm_handler(medianf_init);
  65.  
  66.     do
  67.       {
  68.       dev = rubber_info(win_id, &val, &mr->x, &mr->y,
  69.                 &mr->w, &mr->h, rbcolor, 15);
  70.       switch ((dev = bit_handle_event(dev, val)))
  71.         {
  72.         case MENUBUTTON:
  73.         done = val && medianf_popup(im);
  74.         break;
  75.         case KEYBD:
  76.         done = medianf_keybd(val);
  77.         break;
  78.         }
  79.       }
  80.     while (!done);
  81.  
  82.     set_current_window(win_id);
  83.     rubber_finish();
  84.     remove_wm_handler(medianf_init);
  85.     return 0;
  86. }
  87.  
  88. /**********************************************************************
  89.  * Initialize rubber band location. Also handles window repositioning
  90.  * and window resizing
  91.  **********************************************************************/
  92.  
  93. static int
  94. medianf_init(IPTR im, int wme)
  95. {
  96.     static int oxi, oyi;
  97.  
  98.     set_rubber_obj(RB_RECT);
  99.     set_rubber_bounds(1, im->xi, im->yi, im->w, im->h);
  100.  
  101.     if (wme)
  102.       {
  103.       mr->x += im->xi - oxi;
  104.       mr->y += im->yi - oyi;
  105.       oxi = im->xi;
  106.       oyi = im->yi;
  107.       }
  108.     else
  109.       {
  110.       mr->x = oxi = im->xi;
  111.       mr->y = oyi = im->yi;
  112.       mr->w = im->w;
  113.       mr->h = im->h;
  114.       }
  115.     return 0;
  116. }
  117.  
  118. static int
  119. medianf_popup(IPTR im)
  120. {
  121.     static long mm = -1;
  122.  
  123.     if (mm < 0)
  124.     mm = defpup("MedianF%t|Doit|Done");
  125.  
  126.     switch (dopup(mm))
  127.       {
  128.       case 1:
  129.       img_median_filter(im, mr);
  130.       return 0;
  131.       case 2:
  132.       return 1;
  133.       }
  134.     return 0;
  135. }
  136.  
  137.  
  138.  
  139. /* ARGSUSED */
  140. static int
  141. medianf_keybd(int val)
  142. {
  143.     return val == 27;
  144. }
  145.  
  146. /***********************************************************************
  147.  * End of Median filtering
  148.  *******************************************************************}**/
  149.  
  150. /************************************************************************
  151.  * Sharpen an image. If we are to use threshold, smooth.c
  152.  * might be a better place for this
  153.  ***********************************************************************/
  154.  
  155. #define sharpen_init  medianf_init
  156. #define sharpen_keybd medianf_keybd
  157. static int sharpen_popup(IPTR);
  158.  
  159. int
  160. do_sharpen(IPTR im)
  161. {
  162.     short val;
  163.     long dev;
  164.     int done = 0;
  165.  
  166.     mr = &medfreg;
  167.     sharpen_init(im, 0);
  168.     install_wm_handler(sharpen_init);
  169.  
  170.     do
  171.       {
  172.       dev = rubber_info(win_id, &val, &mr->x, &mr->y,
  173.                 &mr->w, &mr->h, rbcolor, 15);
  174.       switch ((dev = bit_handle_event(dev, val)))
  175.         {
  176.         case MENUBUTTON:
  177.         done = val && sharpen_popup(im);
  178.         break;
  179.         case KEYBD:
  180.         done = sharpen_keybd(val);
  181.         break;
  182.         }
  183.       }
  184.     while (!done);
  185.  
  186.     set_current_window(win_id);
  187.     rubber_finish();
  188.     remove_wm_handler(sharpen_init);
  189.     return 0;
  190. }
  191.  
  192.  
  193. static int **m, sn;
  194. static short m_sp3x3[3][3] =
  195. {
  196.     {-1, -2, -1},
  197.     {-2, 20, -2},
  198.     {-1, -2, -1}
  199. };
  200.  
  201. static void
  202. make_s_mat(int n)
  203. {
  204.     int i, j;
  205.  
  206.     /* currently on 3x3 is supported */
  207.     n = 3;
  208.     free_mat(m);
  209.     m = get_mat(n, n, sizeof(int));
  210.     for (i = 0; i < n; i++)
  211.     for (j = 0; j < n; j++)
  212.         m[i][j] = m_sp3x3[i][j];
  213.     sn = n;
  214. }
  215.  
  216. static int
  217. sharpen_popup(IPTR im)
  218. {
  219.     static long smenu = -1;
  220.     int status = 0;
  221.  
  222.     if (smenu < 0)
  223.       {
  224.       smenu = defpup("Sharpen%t|Doit|Done");
  225.       make_s_mat(3);
  226.  
  227.       }
  228.  
  229.     switch (dopup(smenu))
  230.       {
  231.       case 1:
  232.       status = img_convolv(im, m, sn, sn, 0, mr, "Sharpening ...");
  233.       break;
  234.       case 2:
  235.       status = 1;
  236.       }
  237.  
  238.     return status;
  239. }
  240.